import { useStore } from '@/store'
import { URL } from '@/utils/request'

let webSocket = {
  socketTask: null,
  connectSocket,
  closeSocket
}

export default webSocket;

// const wsUrl = ''; // 测试环境
// const wsUrl=''; // 生产环境
const wsUrl = '/ws/connect';

// socketTask
let socketTask = null
// 心跳定时器
let heartbeatInterval = null
// 是否用户主动关闭websocket
let isActiveClose = false
// 重连延时器
let reconnectTimeout = null

// 创建websocket连接
function connectSocket() {
  const token = useStore().tokenInfo.token

  if (!token) {
    return
  }

  // 建立连接
  const url=URL.replace('https', 'wss').replace('http', 'ws') + wsUrl
  console.log('url: ', url);
  socketTask = uni.connectSocket({
    url: url,
    header: { Authorization: 'Bearer ' + token },
    success(res) {
      console.log('output->正在连接', res)
    },
    fail(res) {
      console.log('output->连接失败', res)
    }
  })

  // 监听连接打开
  socketTask.onOpen((res) => {
    console.log(`output->监听到websocket已打开`, res)

    // 清除原来的定时器（重连情况下）
    clearAllIntervalAndTimeout()

    // 重置关闭状态
    isActiveClose = false

    // 开始心跳
    startHeartbeat()

    // 监听消息
    socketTask.onMessage((data) => {
      console.log(`output->监听到websocket消息`, data)

      // 接收到的消息暴露给外部自定义处理
      webSocket.onMessageCallback(data)
    })
  })

  // 监听连接关闭
  socketTask.onClose((res) => {
    console.log(`output->监听到websocket关闭`, res)

    // 停止发送心跳
    clearInterval(heartbeatInterval)

    // 非主动关闭需要重连
    if (!isActiveClose) {
      reconnectTimeout = setTimeout(() => {
        connectSocket()
      }, 3000);
    }
  })

  webSocket.socketTask = socketTask
}

// 关闭websocket连接
function closeSocket() {
  // 主动关闭
  isActiveClose = true

  // 清除定时器
  clearAllIntervalAndTimeout()

  // 关闭连接
  socketTask.close()

  // 释放变量
  socketTask = null
  heartbeatInterval = null
  reconnectTimeout = null
}

// 开始心跳
function startHeartbeat() {
  heartbeatInterval = setInterval(() => {
    // 以该内容作为心跳信息发送
    sendSocketMessage(JSON.stringify({ cmd: 'PING' }))
  }, 30000);
}

// 发送websocket消息到服务器
function sendSocketMessage(msg) {
  if (socketTask.readyState === 0) {
    // 正在连接，延时3秒再发送消息
    setTimeout(() => {
      socketTask.send({ data: msg })
    }, 3000);
  } else if (socketTask.readyState === 1) {
    // 已连接好，可立即发送
    socketTask.send({ data: msg })
  }
}

// 清除所有定时器和延时器
function clearAllIntervalAndTimeout() {
  if (reconnectTimeout) {
    clearTimeout(reconnectTimeout)
  }
  if (heartbeatInterval) {
    clearInterval(heartbeatInterval)
  }
}